home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Leser 15 / Amiga Plus Leser CD 15.iso / Tools / Development / yacas_alg / yacas_morphos / share / yacas / include / unipoly.h < prev    next >
Encoding:
C/C++ Source or Header  |  2002-03-13  |  1.1 KB  |  71 lines

  1.  
  2. #ifndef __unipoly_h__
  3. #define __unipoly_h__
  4.  
  5. #include "yacasbase.h"
  6. #include "grower.h"
  7.  
  8. typedef  LispInt ZZ;
  9.  
  10. class ZZMod : public YacasBase
  11. {
  12. public:
  13.     ZZMod(LispInt aMod);
  14.     inline ZZ Add(ZZ x, ZZ y);
  15.     inline ZZ Sub(ZZ x, ZZ y);
  16.     inline ZZ Mul(ZZ x, ZZ y);
  17.     inline ZZ Div(ZZ x, ZZ y);
  18.     inline ZZ Mod(ZZ x);
  19. private:
  20.     LispInt iMod;
  21.     CArrayGrower<ZZ> iInverses;
  22. };
  23.  
  24. class ZZPoly : public CArrayGrower<ZZ>
  25. {
  26. public:
  27.     void DropEndZeroes();
  28.     inline ZZ Degree();
  29.     inline void Multiply(const ZZ& x,ZZMod& aMod);
  30. };
  31.  
  32. class ZZPolyList : public CDeletingArrayGrower<ZZPoly*>
  33. {
  34. };
  35.  
  36.  
  37. inline ZZ ZZMod::Add(ZZ x, ZZ y)
  38. {
  39.     return Mod(x+y);
  40. }
  41. inline ZZ ZZMod::Sub(ZZ x, ZZ y)
  42. {
  43.     return Mod(x-y);
  44. }
  45. inline ZZ ZZMod::Mul(ZZ x, ZZ y)
  46. {
  47.     return Mod(x*y);
  48. }
  49. inline ZZ ZZMod::Div(ZZ x, ZZ y)
  50. {
  51.     return Mod(x*iInverses[Mod(y)]);
  52. }
  53. inline ZZ ZZMod::Mod(ZZ x)
  54. {
  55.     ZZ result = x%iMod;
  56.     if (result<0) result+=iMod;
  57.     return result;
  58. }
  59.  
  60. inline ZZ ZZPoly::Degree()
  61. {
  62.     DropEndZeroes();
  63.     return NrItems()-1;
  64. }
  65.  
  66.  
  67. void Berlekamp(ZZPolyList& aResult,ZZPoly& aPoly, ZZ modulo);
  68.  
  69.  
  70. #endif
  71.